﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using AdministracionCooperativa.entidades;

namespace AdministracionCooperativa.Controlador
{
    public class ControlodarRegistroCouta
    {
             
        public static List<tblreg> ObtenerAdeudosByUnidad(string numeroUnidad)
        {
           
            using (combisEntities bd = new combisEntities())
            {
                var resultado = new List<tblreg>();
                if (!VerificarRegistroExistePagado(DateTime.Today, numeroUnidad))
                {
                     resultado = (from r in bd.tblreg
                                     where r.CATUNI_NUMUNI == numeroUnidad
                                         && r.PAGADO == false
                                     select r).ToList();
                    if (!VerificarRegistroExisteNoPagado(DateTime.Today, resultado))
                    {
                        var hoy = CrearCobroActual(numeroUnidad, DateTime.Today);
                        if (EstaEnTaller(numeroUnidad))
                        {
                            hoy.CUOTA = 0;
                        }
                        resultado.Add(hoy);
                    }
                    var f = findeSemana();
                    if (!f.Equals(DateTime.Today))
                    {
                        if (!VerificarRegistroExisteNoPagado(f, resultado))
                        {
                            var cobroporfindesemana = CrearCobroActual(numeroUnidad, f);
                            if (EstaEnTaller(numeroUnidad))
                            {
                                cobroporfindesemana.CUOTA = 0;
                            }
                            resultado.Add(cobroporfindesemana);
                        }
                    }
                    
                }
                if (resultado.Count>0)
                    return resultado.OrderByDescending(r => r.FECHA).ToList();
                else
                    return null;
            }
        }
        public static tblreg CrearCobroActual(string numeroUnidad, DateTime fecha)
        {
            ControladorUnidad.EstablecerUnidad(numeroUnidad);
            var cuota = ControladorCuota.obtenerCouta(ControladorUnidad.unidadActual.CATCOU_idCOU);
            var posturero = (ControladorUnidad.unidadActual.PAGPOS==true) ? ControladorUnidad.unidadActual.COSTOPOS : 0;
            var nuevoRegistro = new tblreg()
            {
                FECHA = new DateTime(fecha.Year, fecha.Month, fecha.Day),
                PAGADO = false,
                POSTURERO = (posturero>0)? posturero:cuota.POSTURERO,
                SEGCHO = cuota.SEGCHO,
                SEGIMSS= cuota.SEGIMSS,
                SUBBAR = cuota.SUBBAR,
                TEMP = cuota.TEMP,
                CHECADOR = cuota.CHECADOR,
                COOSOC = cuota.COOSOC,
                CUOTA = cuota.CUOTA,
                //folio = generarFolio(),
                CATUNI_NUMUNI = numeroUnidad,
                SYSUSR_IDUSR = 1,
                IDREG=-1,
                
            };
            return nuevoRegistro;
        }
        public static long Guardar(tblreg registro)
        {
            if (registro.IDREG>=1)
            {
                return ActualizarRegistro(registro);
            }
            else
            {
                return InsertarRegistro(registro);
            }
        }
        private static long InsertarRegistro(tblreg registroActualiza)
        {
            using (combisEntities bd = new combisEntities())
            {
                var nuevoRegistro = new tblreg()
                {
                    FECHA = registroActualiza.FECHA,
                    PAGADO = registroActualiza.PAGADO,
                    POSTURERO = registroActualiza.POSTURERO,
                    SEGCHO = registroActualiza.SEGCHO,
                    SEGIMSS = registroActualiza.SEGIMSS,
                    SUBBAR = registroActualiza.SUBBAR,
                    TEMP = registroActualiza.TEMP,
                    CHECADOR = registroActualiza.CHECADOR,
                    COOSOC = registroActualiza.COOSOC,
                    CUOTA = registroActualiza.CUOTA,
                    //folio = generarFolio(),
                    CATUNI_NUMUNI = registroActualiza.CATUNI_NUMUNI,
                    SYSUSR_IDUSR = registroActualiza.SYSUSR_IDUSR,
                    //IDREG = -1
                };
                bd.AddTotblreg(nuevoRegistro);
                bd.SaveChanges();
                return nuevoRegistro.IDREG;
            }
        }
        private static long ActualizarRegistro(tblreg registroActualiza)
        {
            using (combisEntities bd = new combisEntities())
            {
                var nuevoRegistro = bd.tblreg.First(c=>c.IDREG==registroActualiza.IDREG);           
                nuevoRegistro.POSTURERO = registroActualiza.POSTURERO;
                nuevoRegistro.SEGCHO = registroActualiza.SEGCHO;
                nuevoRegistro.SEGIMSS = registroActualiza.SEGIMSS;
                nuevoRegistro.SUBBAR = registroActualiza.SUBBAR;
                nuevoRegistro.TEMP = registroActualiza.TEMP;
                nuevoRegistro.CHECADOR = registroActualiza.CHECADOR;
                nuevoRegistro.COOSOC = registroActualiza.COOSOC;
                nuevoRegistro.CUOTA = registroActualiza.CUOTA;
                nuevoRegistro.SYSUSR_IDUSR = registroActualiza.SYSUSR_IDUSR;
                bd.SaveChanges();
                return nuevoRegistro.IDREG;
            }
        }
        public static List<tblreg> ModificarEstatus(List<long> registroModificar)
        {
            using (combisEntities bd = new combisEntities())
            {
                var hoy = DateTime.Today;
                var entidadesModificar = (from i in bd.tblreg where registroModificar.Contains(i.IDREG) select i).ToList();
                var lstFechaMenoresHoy = (from l in entidadesModificar where l.FECHA <= hoy select l).ToList();
                var folio = generarFolio();
                var segundoFolio = GetFolio(folio);
                foreach (var item in entidadesModificar)
                {
                    item.PAGADO = true;
                    item.FECPAG = hoy;
                    item.folio = folio;
                    if (lstFechaMenoresHoy != null)
                    {
                        var it = lstFechaMenoresHoy.FirstOrDefault(c => c.FECPAG == item.FECHA);
                        if (it == null)
                            item.folio = segundoFolio;
                    }
                }
                bd.SaveChanges();

                return entidadesModificar;
            }
        }
        private static string generarFolio()
        {
           
            using (combisEntities bd = new combisEntities())
            {
                var folio = bd.tblreg.Max(c => c.folio);
                if (folio.Length > 0)
                {
                    folio = GetFolio(folio);
                }
                else
                    folio = "100000";
                return folio;
            }
            
        }
        private static string GetFolio(string folio)
        {
            Double folioObtenido = double.Parse(folio);
            folioObtenido += 1;
            return folioObtenido.ToString();
        }
        private static DateTime findeSemana()
        {
            DateTime fecha;
            switch (DateTime.Today.DayOfWeek)
            {
                case DayOfWeek.Friday:
                    fecha = DateTime.Today.AddDays(1);
                    break;
                case DayOfWeek.Monday:
                    fecha = DateTime.Today.AddDays(-1);
                    break;
                default: fecha = DateTime.Today; break;
            }
            return fecha;
        }
        private static bool VerificarRegistroExisteNoPagado(DateTime fecha, List<tblreg> entidades)
        {
            var existe = entidades.Any(e => e.FECHA == fecha);
            return existe;
        }
        private static bool VerificarRegistroExistePagado(DateTime fecha, string numUnidad)
        {
            using (combisEntities bd = new combisEntities())
            {
                var existe = bd.tblreg.Any(e => e.PAGADO == true && e.CATUNI_NUMUNI == numUnidad && e.FECHA == fecha);
                return existe;
            }
        }

        public static decimal CalcularTotal(tblreg entidad)
        {
             var suma= entidad.POSTURERO;
             suma+= entidad.SEGCHO;
             suma += entidad.SEGIMSS;
             suma += entidad.SUBBAR;
             suma += entidad.TEMP;
             suma += entidad.CHECADOR;
             suma += entidad.COOSOC;
             suma += entidad.CUOTA;
             return (decimal)suma;
         }
        public static bool EstaEnTaller(string numeroUnidad)
        {
            using (combisEntities bd = new combisEntities())
            {
                return bd.tbltaller.Any(c=>c.FECFIN==null && c.CATUNI_NUMUNI==numeroUnidad);
               
            }
        }
    }

}
